#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/rope>
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define int long long
#define double long double
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define rbtree(way) tree<way,null_type,less<way>,rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
const int maxn=1e6+10,maxm=1e6+10,mod=998244353,inf=INT_MAX;
inline int ksm(int x,int k,int mod=mod){
	int ans=1;
	for(;k;k>>=1,x=x*x%mod) if(k&1) ans=ans*x%mod;
	return ans;
}

namespace dft{
	int n,t[maxn],a[maxn],b[maxn];
	void ntt(int *a){
		rep(i,1,n-2) if(i<t[i]) swap(a[i],a[t[i]]);
		for(int l=1;l<n;l<<=1) for(int i=0,w=1,wadd=ksm(3,(mod-1)/l/2),x,y;i<n;i+=2*l,w=1)
			rep(j,i,i+l-1) x=a[j],y=a[j+l]*w%mod,a[j]=(x+y)%mod,a[j+l]=(x+mod-y)%mod,w=w*wadd%mod;
	}
	void main(){
		rep(i,1,n-1) t[i]=t[i>>1]>>1|((i&1)*n>>1);
		ntt(a),ntt(b);
		rep(i,0,n-1) a[i]=a[i]*b[i]%mod;
		ntt(a);
		int tmp=ksm(n,mod-2);
		rep(i,0,n-1) (a[i]*=tmp)%=mod;
		rep(i,1,n-1>>1) swap(a[i],a[n-i]);
	}
}
int n,m,k,sl,ans,fl[maxn],fct[maxn],nfc[maxn],a[maxn],c[maxn];
vector<int> e[maxn];
void solve(int l,int r){
	if(l==r) return void();
	int mid=l+r>>1;
	solve(l,mid),dft::n=(r-l+1)*2;
	rep(i,0,dft::n-1) dft::a[i]=dft::b[i]=0;
	rep(i,l,mid) dft::a[i-l]=a[i]*nfc[i]%mod;
	rep(i,l,r) dft::b[i-l]=nfc[i-l];
	dft::main();
	rep(i,mid+1,r) (a[i]+=mod-fct[i]*dft::a[i-l]%mod)%=mod;
	solve(mid+1,r);
}
void dfs(int x){
	if(x==n+1){
		int ret=0;
		rep(i,1,n) for(int x:e[i]) if(c[i]==c[x]) return;
		rep(i,1,m) rep(j,1,n) if(c[j]==i&&fl[j]) ++ret,j=jend;
		++a[ret];
		return;
	}
	rep(i,1,m) c[x]=i,dfs(x+1);
}

signed main(){
	freopen("tree.in","r",stdin),freopen("tree.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>k>>sl,fct[0]=nfc[0]=1;
	rep(i,1,max(m,n)) fct[i]=fct[i-1]*i%mod,nfc[i]=ksm(fct[i],mod-2);
	if(n==sl){
		int m1=1<<(int)ceil(log2(m));
		rep(i,1,m) a[i]=i*ksm(i-1,n-1)%mod;
		solve(1,m1);
		rep(i,1,m) (ans+=a[i]*fct[m]%mod*nfc[i]%mod*nfc[m-i]%mod*ksm(i,k))%=mod;
		return cout<<ans,0;
	}
	rep(i,1,sl){
		int tmp;
		cin>>tmp,fl[tmp]=1;
	}
	rep(i,1,n-1){
		int u,v;
		cin>>u>>v,e[u].pb(v),e[v].pb(u);
	}
	dfs(1);
	rep(i,1,m) (ans+=a[i]*ksm(i,k))%=mod;
	cout<<ans;
	return 0;
}/*
0 2 48 324 1280
0 2 42 144
*/
